// 版权所有2009 Go作者。版权所有。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

// 包ioutil实现了一些I/O实用程序函数。
// 
// 从Go 1.16开始，相同的功能现在由包io或包os提供，这些实现
// 在新代码中应该是首选。
// 详见具体功能文档。
package ioutil

import (
	"io"
	"io/fs"
	"os"
	"sort"
)

// ReadAll从r读取，直到出现错误或EOF，并返回它读取的数据。
// 成功的调用返回err==nil，而不是err==EOF。因为ReadAll是
// 定义为从src读取直到EOF，所以它不会将读取
// 的EOF视为要报告的错误。
// 
// 从Go 1.16开始，此函数只调用io.ReadAll。
func ReadAll(r io.Reader) ([]byte, error) {
	return io.ReadAll(r)
}

// ReadFile读取按文件名命名的文件并返回内容。
// 成功的调用返回err==nil，而不是err==EOF。由于ReadFile 
// 读取整个文件，因此它不会将读取的EOF视为要报告的错误
// 。
// 
// 从Go 1.16开始，此函数只调用os.ReadFile。
func ReadFile(filename string) ([]byte, error) {
	return os.ReadFile(filename)
}

// WriteFile将数据写入以文件名命名的文件。
// 如果文件不存在，WriteFile将使用perm 
// （在umask之前）的权限创建该文件；否则，WriteFile会在写入之前将其截断，而不会更改权限。
// 
// 从Go 1.16开始，此函数只调用os.WriteFile。
func WriteFile(filename string, data []byte, perm fs.FileMode) error {
	return os.WriteFile(filename, data, perm)
}

// ReadDir读取以dirname命名的目录，并返回该目录内容的fs.FileInfo列表，
// 按文件名排序。如果读取目录时发生错误，
// ReadDir将不返回任何目录项。
// 
// 从Go 1.16开始，os.ReadDir是一个更有效、更正确的选择：
// 它返回一个fs.DirEntry列表而不是fs.FileInfo，
// 如果在读取目录的中途出现错误，它将返回部分结果。
func ReadDir(dirname string) ([]fs.FileInfo, error) {
	f, err := os.Open(dirname)
	if err != nil {
		return nil, err
	}
	list, err := f.Readdir(-1)
	f.Close()
	if err != nil {
		return nil, err
	}
	sort.Slice(list, func(i, j int) bool { return list[i].Name() < list[j].Name() })
	return list, nil
}

// nocloser返回一个ReadCloser，其中包含一个包装
// 提供的读取器r的无操作关闭方法。
// 
// 从Go 1.16开始，此函数只调用io.noCloser。
func NopCloser(r io.Reader) io.ReadCloser {
	return io.NopCloser(r)
}

// Discard是一个io.Writer，在该io.Writer上，所有写入调用都会成功
// 而不执行任何操作。
// 
// 从Go 1.16开始，该值只是io.Discard。
var Discard io.Writer = io.Discard
